/**
 * User: Justin Akin
 * Twitter: @idointernet
 * Date: 7/14/12
 */
jpackage( "twc.utils", function() {

	var UTF8Util = this.UTF8Util;

	var keystr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

	this.Base64Util = {

		encode: function( input ) {

			var chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0, output = "";

			input = UTF8Util.encode( input );

			while( i < input.length ) {

				chr1 = input.charCodeAt( i++ );
				chr2 = input.charCodeAt( i++ );
				chr3 = input.charCodeAt( i++ );

				enc1 = chr1 >> 2;
				enc2 = ( ( chr1 & 3 ) << 4 ) | ( chr2 >> 4 );
				enc3 = ( ( chr2 & 15 ) << 2 ) | ( chr3 >> 6 );
				enc4 = chr3 & 63;

				if( isNaN( chr2 ) ) {
					enc3 = enc4 = 64;
				}
				else if( isNaN( chr3 ) ) {
					enc4 = 64;
				}

				output = output +
					keystr.charAt( enc1 ) + keystr.charAt( enc2 ) +
					keystr.charAt( enc3 ) + keystr.charAt( enc4 );
			}

			return output;

		},

		decode: function( input ) {

			var chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0, output = "";

			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

			while( i < input.length ) {

				enc1 = keystr.indexOf( input.charAt( i++ ) );
				enc2 = keystr.indexOf( input.charAt( i++ ) );
				enc3 = keystr.indexOf( input.charAt( i++ ) );
				enc4 = keystr.indexOf( input.charAt( i++ ) );

				chr1 = ( enc1 << 2 ) | ( enc2 >> 4 );
				chr2 = ( ( enc2 & 15 ) << 4 ) | ( enc3 >> 2 );
				chr3 = ( ( enc3 & 3 ) << 6 ) | enc4;

				output = output + String.fromCharCode( chr1 );

				if( enc3 != 64 ) {
					output = output + String.fromCharCode( chr2 );
				}

				if( enc4 != 64 ) {
					output = output + String.fromCharCode( chr3 );
				}

			}

			output = UTF8Util.decode( output );

			return output;

		}

	}

});